triggerを使って.gitlab-ci.ymlを分割する
.gitlab-ci.ymlとは
GitLab CI/CD パイプラインの設定ファイルです。GitLab Runner上でここに書いてあるJobが書かれている設定順序で実行されていきます。
課題: .gitlab-ci.ymlが肥大化
そんな.gitlab-ci.yml
ファイルですが、リポジトリのルートディレクトリに配置する必要があります。ここにそのリポジトリに関するCI/CDの情報をつらつらと書き連ねていくのですが、モノレポ構成にしている場合、全モジュールのCI/CD設定がこのルートディレクトリの.gitlab-ci.yml
に書かれていくことになりすぐに肥大化していき、読みにくく、また変更が難しくなっていきます。
モノレポ例
. ├── module-a │ ├── somefiles │ . │ . ├── module-b │ ├── somefiles │ . │ . ├── module-c │ ├── somefiles │ . │ . └── .gitlab-ci.yml
.gitlab-ci.yml例
module-a-build-job: stage: build script: - echo "This job builds something" rules: - if: $CI_COMMIT_BRANCH changes: - module-a/**/* module-a-test-job: stage: test script: - echo "This job tests something" rules: - if: $CI_COMMIT_BRANCH changes: - module-a/**/* module-a-deploy-prod: stage: deploy script: - echo "This job deploys something" rules: - if: $CI_COMMIT_BRANCH changes: - module-a/**/* module-b-build-job: stage: build script: - echo "This job builds something" rules: - if: $CI_COMMIT_BRANCH changes: - module-b/**/* module-b-test-job: stage: test script: - echo "This job tests something" rules: - if: $CI_COMMIT_BRANCH changes: - module-b/**/* module-b-deploy-prod: stage: deploy script: - echo "This job deploys something" rules: - if: $CI_COMMIT_BRANCH changes: - module-b/**/* module-c-build-job: stage: build script: - echo "This job builds something" rules: - if: $CI_COMMIT_BRANCH changes: - module-c/**/* module-c-test-job: stage: test script: - echo "This job tests something" rules: - if: $CI_COMMIT_BRANCH changes: - module-c/**/* module-c-deploy-prod: stage: deploy script: - echo "This job deploys something" rules: - if: $CI_COMMIT_BRANCH changes: - module-c/**/*
解決: triggerを使う
このような場合、trigger
パラメーターを使って別ファイルに定義を分割することを考えましょう。
ルートディレクトリの.gitlab-ci.yml
は以下のようになります。条件付きで他ファイルを呼び出しているだけですね。
trigger-module-a: stage: triggers trigger: include: module-a/.gitlab-ci.yml strategy: depend rules: - if: $CI_COMMIT_BRANCH changes: - module-a/**/* trigger-module-b: stage: triggers trigger: include: module-b/.gitlab-ci.yml strategy: depend rules: - if: $CI_COMMIT_BRANCH changes: - module-b/**/* trigger-module-c: stage: triggers trigger: include: module-c/.gitlab-ci.yml strategy: depend rules: - if: $CI_COMMIT_BRANCH changes: - module-c/**/*
各モジュールディレクトリーの直下にもYAMLファイルを作成し、こちらに具体的なJobを定義します。
module-a-build-job: stage: build script: - echo "This job builds something" module-a-test-job: stage: test script: - echo "This job tests something" module-a-deploy-prod: stage: deploy script: - echo "This job deploys something"
これにより、
- モジュール毎のCI/CDジョブ内容を、そのモジュールディレクトリ内に定義することができ、だいぶ読みやすくなりました。
rules
パラメーターの使用もルートディレクトリの.gitlab-ci.yml
内で各モジュールごとに一回で済み、スッキリしました。